package __slice

import "fmt"

func Demo() {
	a := []int{1, 2, 3, 4, 5}
	fmt.Printf("a=%p\n", &a)
	// add 函数里改变了a的内容，影响到了a
	add(a)
	fmt.Println("add a=", a)
	// dele函数删除了a的内容，没有影响a
	dele(a)
	fmt.Println("delete a=", a)
	// 原因：
	// slice本身也是结构体，包含 array,len,cap 三个字段
	// array 是传指针，len和cap传值
	// 如果只改变array，就会影响底层数组
	// 如果改变了len或者cap，必须返回一个新的切片

	bibao()

	v := Inc()
	fmt.Println("v=", v)
}

func add(x []int) {
	fmt.Printf("add x=%p\n", x)
	x[0] = 6
}

func dele(x []int) {
	fmt.Printf("delete x=%p\n", x)
	x = x[1:]
	fmt.Printf("delete x=%p\n", x)
}

func bibao() {
	x := 0
	func() {
		x++
	}()
	fmt.Println("x=", x)
}

func Inc() (v int) {
	defer func() { v++ }()
	return 42
}
